package qqmeeting

// 创建会议
type MeetingCreateRequest struct {
	UserID                    string      `json:"userid"`                                 // 调用方用于标示用户的唯一 ID
	InstanceID                int         `json:"instanceid"`                             // 用户的终端设备类型
	Subject                   string      `json:"subject"`                                // 会议主题
	Hosts                     []*UserObj  `json:"hosts,omitempty"`                        // 会议主持人的用户 ID，如果没有指定，主持人被设定为参数 userid 的用户，即 API 调用者。
	Type                      *int        `json:"type,omitempty"`                         // 会议类型
	Invitees                  []*UserObj  `json:"invitees,omitempty"`                     // 会议邀请的参会者，可为空
	StartTime                 string      `json:"start_time"`                             // 会议开始时间戳（单位秒）。
	EndTime                   string      `json:"end_time"`                               // 会议结束时间戳（单位秒）。
	Password                  *string     `json:"password,omitempty"`                     // 会议密码，可不填
	Settings                  *Settings   `json:"settings,omitempty"`                     // 会议设置
	EnableLive                *bool       `json:"enable_live,omitempty"`                  // 是否开启直播
	LiveConfig                *LiveConfig `json:"live_config,omitempty"`                  // 直播配置
	EnableDocUploadPermission *bool       `json:"enable_doc_upload_permission,omitempty"` // 是否允许成员上传文档
	MediaSetType              *int        `json:"media_set_type,omitempty"`               // 该参数仅提供给支持混合云的企业可见
	EnableInterpreter         *bool       `json:"enable_interpreter,omitempty"`           // 同声传译开关
	EnableEnroll              *bool       `json:"enable_enroll,omitempty"`                // 是否激活报名
	EnableHostKey             *bool       `json:"enable_host_key,omitempty"`              // 是否开启主持人密钥
	HostKey                   *string     `json:"host_key,omitempty"`                     // 主持人密钥，仅支持6位数字
	SyncToWework              *bool       `json:"sync_to_wework,omitempty"`               // 会议是否同步至企业微信
	TimeZone                  *string     `json:"time_zone,omitempty"`                    // 时区
	Location                  *string     `json:"location,omitempty"`                     // 会议地点。最长支持18个汉字或36个英文字母
}

func (req MeetingCreateRequest) getDescriptor() *MeetingRequestDescriptor {
	return &RequestDescriptorMeetingCreate
}

func (req MeetingCreateRequest) fillPlaceholder(args ...interface{}) string {
	return req.getDescriptor().Url
}

type MeetingCreateResponse struct {
	NextPos             int            `json:"next_pos"`
	Remaining           int            `json:"remaining"`
	MeetingNumber       int            `json:"meeting_number"`    // 会议数量
	MeetingCreationInfo []*MeetingInfo `json:"meeting_info_list"` // 预约会议列表
}

// 通过会议ID获取会议信息
type MeetingQueryByIDRequest struct {
	MeetingID  string `param:"meeting_id"`
	UserID     string `query:"userid"`
	InstanceID int    `query:"instanceid"`
}

func (req MeetingQueryByIDRequest) getDescriptor() *MeetingRequestDescriptor {
	return &RequestDescriptorMeetingQueryByID
}

func (req MeetingQueryByIDRequest) fillPlaceholder(args ...interface{}) string {
	return defaultPlaceholderFiller(req, args...)
}

// 通过Code获取会议信息
//
// BUG(hafrans) 腾讯会议API接口报错，不知道什么问题，本地HTTP抓包未发现异常。
type MeetingQueryByCodeRequest struct {
	MeetingCode string `json:"-" query:"meeting_code"`
	UserID      string `json:"-" query:"userid"`
	InstanceID  int    `json:"-" query:"instanceid"`
}

func (req MeetingQueryByCodeRequest) getDescriptor() *MeetingRequestDescriptor {
	return &RequestDescriptorMeetingQueryByCode
}

func (req MeetingQueryByCodeRequest) fillPlaceholder(args ...interface{}) string {
	return req.getDescriptor().Url
}

type MeetingQueryResponse struct {
	NextPos         int                 `json:"next_pos"`
	Remaining       int                 `json:"remaining"`
	MeetingNumber   int                 `json:"meeting_number"`    // 会议数量
	MeetingInfoList []*MeetingQueryInfo `json:"meeting_info_list"` // 会议列表
}

// 取消会议
type MeetingCancelRequest struct {
	MeetingID    string  `json:"-" param:"meeting_id"`     // 会议的唯一 ID。
	UserID       string  `json:"userid"`                   // 调用方用于标示用户的唯一 ID
	InstanceID   int     `json:"instanceid"`               // 用户的终端设备类型
	ReasonCode   int     `json:"reason_code"`              // 原因代码，可为用户自定义
	ReasonDetail *string `json:"reason_detail,omitempty"`  // 详细取消原因描述。
	MeetingType  *int    `json:"meeting_type,omitempty"`   // 会议类型
	SubMeetingID *string `json:"sub_meeting_id,omitempty"` // 周期性子会议 ID
}

func (req MeetingCancelRequest) getDescriptor() *MeetingRequestDescriptor {
	return &RequestDescriptorMeetingCancelByID
}

func (req MeetingCancelRequest) fillPlaceholder(args ...interface{}) string {
	return defaultPlaceholderFiller(req, args...)
}

// MeetingUpdateRequest 修改某指定会议的会议信息
type MeetingUpdateRequest struct {
	MeetingID                 string      `json:"-" param:"meeting_id"`
	UserID                    string      `json:"userid"`                                 // 调用方用于标示用户的唯一 ID
	InstanceID                int         `json:"instanceid"`                             // 用户的终端设备类型
	Subject                   string      `json:"subject"`                                // 会议主题
	Hosts                     []*UserObj  `json:"hosts,omitempty"`                        // 会议主持人的用户 ID，如果没有指定，主持人被设定为参数 userid 的用户，即 API 调用者。
	MeetingType               *int        `json:"meeting_type,omitempty"`                 // 会议类型
	Invitees                  []*UserObj  `json:"invitees,omitempty"`                     // 会议邀请的参会者，可为空
	StartTime                 string      `json:"start_time"`                             // 会议开始时间戳（单位秒）。
	EndTime                   string      `json:"end_time"`                               // 会议结束时间戳（单位秒）。
	Password                  *string     `json:"password,omitempty"`                     // 会议密码，可不填
	Settings                  *Settings   `json:"settings,omitempty"`                     // 会议设置
	EnableLive                *bool       `json:"enable_live,omitempty"`                  // 是否开启直播
	LiveConfig                *LiveConfig `json:"live_config,omitempty"`                  // 直播配置
	EnableDocUploadPermission *bool       `json:"enable_doc_upload_permission,omitempty"` // 是否允许成员上传文档
	MediaSetType              *int        `json:"media_set_type,omitempty"`               // 该参数仅提供给支持混合云的企业可见
	EnableEnroll              *bool       `json:"enable_enroll,omitempty"`                // 是否激活报名
	EnableHostKey             *bool       `json:"enable_host_key,omitempty"`              // 是否开启主持人密钥
	HostKey                   *string     `json:"host_key,omitempty"`                     // 主持人密钥，仅支持6位数字
	TimeZone                  *string     `json:"time_zone,omitempty"`                    // 时区
	Location                  *string     `json:"location,omitempty"`                     // 会议地点。最长支持18个汉字或36个英文字母
}

func (req MeetingUpdateRequest) getDescriptor() *MeetingRequestDescriptor {
	return &RequestDescriptorMeetingUpdateByID
}

func (req MeetingUpdateRequest) fillPlaceholder(args ...interface{}) string {
	return defaultPlaceholderFiller(req, args...)
}

type MeetingUpdateResponse struct {
	MeetingNumber   int                      `json:"meeting_number"`    // 会议数量
	MeetingInfoList []*SimplifiedMeetingInfo `json:"meeting_info_list"` // 会议列表
}

// MeetingQueryParticipantsRequest
// 会议拥有者获取某指定会议的参与人员列表。只有会议的拥有者即创建者可以查询参会成员的列表。其他用
// 户的调用会被拒绝。如果会议还未开始，调用此接口查询会返回空列表。
type MeetingQueryParticipantsRequest struct {
	MeetingID      string  `param:"meeting_id"`
	UserID         *string `query:"userid"`
	SubMeetingID   *string `query:"sub_meeting_id"`
	OperatorID     *string `query:"operator_id"`
	OperatorIDType *int    `query:"operator_id_type"`
	Pos            *int    `query:"pos"`
	Size           *int    `query:"size"`
	StartTime      *int    `query:"start_time"`
	EndTime        *string `query:"end_time"`
}

func (req MeetingQueryParticipantsRequest) getDescriptor() *MeetingRequestDescriptor {
	return &RequestDescriptorMeetingQueryParticipantsByID
}

func (req MeetingQueryParticipantsRequest) fillPlaceholder(args ...interface{}) string {
	return defaultPlaceholderFiller(req, args...)
}

type MeetingQueryParticipantsResponse struct {
	MeetingID         string                 `json:"meeting_id"`          // 会议的唯一 ID
	MeetingCode       string                 `json:"meeting_code"`        // 会议号码
	Subject           string                 `json:"subject"`             // 会议主题
	ScheduleStartTime string                 `json:"schedule_start_time"` // 预定会议开始时间戳（单位秒）
	ScheduleEndTime   string                 `json:"schedule_end_time"`   // 预定会议结束时间戳（单位秒）
	Participants      []*MeetingParticipants `json:"participants"`        // 参会人员对象数组。
	HasRemaining      bool                   `json:"has_remaining"`       // 是否还有未拉取的数据，该接口可多次拉取到的数据总量上限为5w条
	NextPos           int                    `json:"next_pos"`            // 和“has_remaining”一起，数据量比较大的情况下支持参会成员列表的多次获取
	TotalCount        int                    `json:"total_count"`         // 当前参会总人次
}

// 获取某指定用户的会议列表
type MeetingQueryUserMeetingListRequest struct {
	UserID     string `query:"userid"`
	InstanceID int    `query:"instanceid"`
}

func (req MeetingQueryUserMeetingListRequest) getDescriptor() *MeetingRequestDescriptor {
	return &RequestDescriptorMeetingQueryUserMeetingList
}

func (req MeetingQueryUserMeetingListRequest) fillPlaceholder(args ...interface{}) string {
	return req.getDescriptor().Url
}

type MeetingQueryUserMeetingListResponse struct {
	NextPos         int                                `json:"next_pos"`
	Remaining       int                                `json:"remaining"`
	MeetingNumber   int                                `json:"meeting_number"`
	MeetingInfoList []*MeetingQueryUserListMeetingInfo `json:"meeting_info_list"`
}

type MeetingCustomerShortUrlRequest struct {
	MeetingID    string `json:"meeting_id"`
	CustomerData string `json:"customer_data"`
}

func (req MeetingCustomerShortUrlRequest) getDescriptor() *MeetingRequestDescriptor {
	return &RequestDescriptorMeetingCustomerShortUrl
}

func (req MeetingCustomerShortUrlRequest) fillPlaceholder(args ...interface{}) string {
	return defaultPlaceholderFiller(req, args...)
}

type MeetingCustomerShortUrlResponse struct {
	MeetingShortUrlCustomerData *MeetingCustomerDataInfo `json:"meeting_short_url_customer_data"`
}

// 发起签到
type MeetingSignInRequest struct {
	OperatorIDType      int     `json:"operator_id_type"`                // 操作者 ID 的类型
	OperatorID          string  `json:"operator_id"`                     // 操作者 ID
	InstanceID          int     `json:"instanceid"`                      // 用户的终端设备类型
	MeetingID           string  `json:"meeting_id"`                      // 会议 ID
	SignInTime          int     `json:"sign_in_time"`                    // 如果是限时签到，需传入签到时长（分钟），最多90分钟
	SignType            int8    `json:"sign_type"`                       // 签到类型
	SignInSpecification *string `json:"sign_in_specification,omitempty"` // 签到说明，最多20个字符
}

func (req MeetingSignInRequest) getDescriptor() *MeetingRequestDescriptor {
	return &RequestDescriptorMeetingSignIn
}

func (req MeetingSignInRequest) fillPlaceholder(args ...interface{}) string {
	return defaultPlaceholderFiller(req, args...)
}

type MeetingSignInResponse struct {
	SignInID string `json:"sign_in_id"`
}

// 获取签到列表
type MeetingQuerySignInListRequest struct {
	MeetingID      string `query:"meeting_id"`       // 会议ID
	OperatorIDType int    `query:"operator_id_type"` // 操作者 ID 的类型
	OperatorID     string `query:"operator_id"`      // 操作者 ID。operator_id 必须与 operator_id_type 配合使用。根据 operator_id_type 的值，operator_id 代表不同类型
	InstanceID     int    `query:"instanceid"`       // 用户的终端设备类型
	PageSize       *int   `query:"page_size"`        // 分页大小，默认值为10，最大为20
	Page           *int   `query:"page"`             // 页码，从1开始，默认值为1
}

func (req MeetingQuerySignInListRequest) getDescriptor() *MeetingRequestDescriptor {
	return &RequestDescriptorMeetingQuerySignInList
}

func (req MeetingQuerySignInListRequest) fillPlaceholder(args ...interface{}) string {
	return req.getDescriptor().Url
}

type MeetingQuerySignInListResponse struct {
	SignInList []*SignInInfo `json:"sign_in_list"`
}

// 获取签到记录
type MeetingQuerySignInEventListRequest struct {
	MeetingID      string `query:"meeting_id"`       // 会议ID
	OperatorIDType int    `query:"operator_id_type"` // 操作者 ID 的类型
	OperatorID     string `query:"operator_id"`      // 操作者 ID。operator_id 必须与 operator_id_type 配合使用。根据 operator_id_type 的值，operator_id 代表不同类型
	InstanceID     int    `query:"instanceid"`       // 用户的终端设备类型
	SignInID       string `query:"sign_in_id"`       // 签到 ID
	PageSize       *int   `query:"page_size"`        // 分页大小，默认值为10，最大为20
	Page           *int   `query:"page"`             // 页码，从1开始，默认值为1
}

func (req MeetingQuerySignInEventListRequest) getDescriptor() *MeetingRequestDescriptor {
	return &RequestDescriptorMeetingQuerySignInEventList
}

func (req MeetingQuerySignInEventListRequest) fillPlaceholder(args ...interface{}) string {
	return req.getDescriptor().Url
}

type MeetingQuerySignInEventListResponse struct {
	TotalCount          int            `json:"total_count"`           // 数据总条数
	CurrentSize         int            `json:"current_size"`          // 当前页数据条数
	TotalPage           int            `json:"total_page"`            // 总页数
	CurrentPage         int            `json:"current_page"`          // 当前页码
	Events              []*SignInEvent `json:"events"`                // 签到记录
	SignInID            string         `json:"sign_in_id"`            // 签到 ID
	StartTime           int32          `json:"start_time"`            // 签到开始时间戳（秒）
	SignInSpecification string         `json:"sign_in_specification"` // 签到说明
}

// 结束会议
type MeetingDismissRequest struct {
	MeetingID           string  `json:"-" param:"meeting_id"`            // 会议的唯一 ID。
	OperatorID          *string `json:"operator_id,omitempty"`           // 操作者 ID
	OperatorIDType      *int    `json:"operator_id_type,omitempty"`      // 操作者 ID 的类型
	UserID              *string `json:"userid,omitempty"`                // 调用方用于标示用户的唯一 ID
	InstanceID          int     `json:"instanceid"`                      // 用户的终端设备类型
	ReasonCode          int     `json:"reason_code"`                     // 原因代码，可为用户自定义
	ReasonDetail        *string `json:"reason_detail,omitempty"`         // 详细取消原因描述。
	ForceDismissMeeting *int    `json:"force_dismiss_meeting,omitempty"` // 是否强制结束会议，默认值为1
	RetrieveCode        *int    `json:"retrieve_code,omitempty"`         // 是否回收会议号，默认值为0
}

func (req MeetingDismissRequest) getDescriptor() *MeetingRequestDescriptor {
	return &RequestDescriptorMeetingDismissByID
}

func (req MeetingDismissRequest) fillPlaceholder(args ...interface{}) string {
	return defaultPlaceholderFiller(req, args...)
}

// 查询实时会中成员列表
type MeetingQueryRealTimeParticipantsRequest struct {
	MeetingID      string  `param:"meeting_id"`
	SubMeetingID   *string `query:"sub_meeting_id"`
	OperatorID     string  `query:"operator_id"`
	OperatorIDType int     `query:"operator_id_type"`
	Page           int     `query:"page"`      // 当前页，页码起始值为1
	PageSize       int     `query:"page_size"` // 分页大小，最大50条
}

func (req MeetingQueryRealTimeParticipantsRequest) getDescriptor() *MeetingRequestDescriptor {
	return &RequestDescriptorMeetingQueryRealTimeParticipantsByID
}

func (req MeetingQueryRealTimeParticipantsRequest) fillPlaceholder(args ...interface{}) string {
	return defaultPlaceholderFiller(req, args...)
}

type MeetingQueryRealTimeParticipantsResponse struct {
	MeetingID         string                 `json:"meeting_id"`          // 会议的唯一 ID
	MeetingCode       string                 `json:"meeting_code"`        // 会议号码
	Subject           string                 `json:"subject"`             // 会议主题
	ScheduleStartTime string                 `json:"schedule_start_time"` // 预定会议开始时间戳（单位秒）
	ScheduleEndTime   string                 `json:"schedule_end_time"`   // 预定会议结束时间戳（单位秒）
	Status            string                 `json:"status"`              // 当前会议状态
	Participants      []*MeetingParticipants `json:"participants"`        // 参会人员对象数组。
	CurrentPage       int                    `json:"current_page"`        // 当前页
	CurrentSize       int                    `json:"current_size"`        // 当前页实际大小
	TotalCount        int                    `json:"total_count"`         // 根据条件筛选后的总人数
	TotalPage         int                    `json:"total_page"`          // 根据条件筛选后的总分页数
}
